package hao.itheima.controller;


import com.sun.xml.bind.v2.TODO;
import hao.itheima.entity.Emp;
import hao.itheima.entity.EmpQueryParam;
import hao.itheima.entity.PageBean;
import hao.itheima.entity.Result;
import hao.itheima.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;

// 一般是一个模块一个controller
@Slf4j
@RestController
@RequestMapping("/emps") //进行公共路径的抽取
public class EmpController {
    @Autowired
    private EmpService empService;

    /**
     * 分页查询
     *
     * @param empQueryParam
     * @return
     */
    // 简单参数接受方式三:保证请求参数名与形参变量名相同, 直接接收
    // 指定默认值: 方式一: 使用if 判断
    //          方式二: 使用@PathParam(defaultValue = "1")
    /*@GetMapping("/emps")
    //                    注意: 里面写的值得是字符串
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize) {
        // 要存在默认参数, 不指定默认参数, 就可能包NullPointerException
        //一般都是,写一步测一步 -- 是用占位符进行打印
        log.info("分页查询: {}, {}", page, pageSize);
        PageBean pageBean = empService.page(page, pageSize);
        return Result.success(pageBean);
    } */

   /* //参数比较少的情况, 直接将参数写在形参列表
    @GetMapping("/emps")
    //                    注意: 里面写的值得是字符串
    public Result page(
            String name,
            Integer gender,
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        // 要存在默认参数, 不指定默认参数, 就可能包NullPointerException
        //一般都是,写一步测一步 -- 是用占位符进行打印
        log.info("分页查询: {},{},{},{},{},{}", name, gender, begin, end, page, pageSize);
//        PageBean pageBean = empService.page(name, gender, begin, end,page, pageSize); // 传了参数, 不用, MyBatis底层就会报错
        return Result.success();
    } */

    // 使用对象封装参数
    @GetMapping
    //                    注意: 里面写的值得是字符串
    public Result page(
            EmpQueryParam empQueryParam) {
        // 要存在默认参数, 不指定默认参数, 就可能包NullPointerException
        //一般都是,写一步测一步 -- 是用占位符进行打印
        log.info("分页查询: {},{},{},{},{},{}",
                empQueryParam.getName(),
                empQueryParam.getGender(),
                empQueryParam.getBegin(), empQueryParam.getEnd(),
                empQueryParam.getPage(), empQueryParam.getPageSize());
        PageBean pageBean = empService.page(empQueryParam); // 传了参数, 不用, MyBatis底层就会报错
        return Result.success(pageBean);
    }


    /**
     * 新增员工
     *
     * @param emp
     * @return
     */

    @PostMapping
    public Result save(@RequestBody Emp emp) {
        log.info("保存员工: {}", emp);
        empService.save(emp);
        return Result.success();
    }

    /**
     * 删除员工
     *
     * @param ids
     * @return
     */

    @DeleteMapping
    //直接通过数组即可接受前端传递的数值
//    public Result delete(Integer[] ids){
    //通过集合类型接受前端传递的数组值, 需要加注解@RequestParam
    public Result delete(@RequestParam List<Integer> ids) {
        log.info("删除员工: {}", ids);
        empService.delete(ids);
        return Result.success();
    }

    /**
     * 员工回显
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        log.info("回显员工, {}", id);

        Emp emp = empService.getById(id);
        return Result.success(emp);
    }

    /**
     * 修改员工信息
     *
     * @param emp
     * @return
     */
    @PutMapping
    public Result update(@RequestBody Emp emp) {
        //1.查看前端传过来的数据
        log.info("更新员工: {}", emp);
        //2.调用service完成更新
        empService.update(emp);
        //3.返回结果
        return Result.success();
    }

    @GetMapping("/list")
    public Result findAllEmp() {
        //1.调用service进行逻辑处理
        List<Emp> empListData = empService.list();
        //2.返回结果
        return Result.success(empListData);
    }
}
